// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add('login', (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })

Cypress.Commands.add("login", () => {
    cy.visit("/user/login")
    cy.get("#username").focus().clear().type(Cypress.env("SYSOM_ACCOUNT_USERNAME"))
    cy.get("#password").focus().clear().type(Cypress.env("SYSOM_ACCOUNT_PASSWORD"))
    cy.get("button").contains("登录").click()
    cy.get("button").contains("忽 略").click()
})

/**
 * SysOM 诊断测试封装
 * @param {*} pageUrl               诊断前端url
 * @param {*} params                诊断参数
 * @param {*} resultCheckCallback   诊断结果处理（在此处判断诊断结果是否符合预期）
 */
Cypress.Commands.add("sysomDiagnosisCheck", (pageUrl, params, resultCheckCallback) => {
    cy.intercept("POST", "/api/v1/tasks/")
        .as("createDiagnosisTask")

    cy.intercept("GET", "/api/v1/tasks/?*")
        .as("getDiagnosisTasks")

    cy.intercept("GET", "/api/v1/tasks/*/")
        .as("getTaskDetail")

    // 1. 访问自定义诊断页面
    cy.visit(pageUrl)

    // 2 输入instance参数
    for (let k in params) {
        if (k.indexOf("instance") != -1) {
            cy.get(`#${k}`).parent().parent().click()
            cy.get(".rc-virtual-list-holder-inner").contains(params[k]).click()
        } else {
            cy.get(`#${k}`).invoke("attr", "readonly").then(res => {
                if (!!res) {
                    // readonly options
                    cy.get(`#${k}`).parent().parent().click()
                    cy.get(".rc-virtual-list-holder-inner").contains(params[k]).click()
                } else {
                    cy.get(`#${k}`).focus().clear().type(params[k], {force: true})
                }
            })
        }
    }

    // 3 点击开始诊断按钮发起诊断
    cy.get("button").contains("开始诊断").click()

    ///////////////////////////////////////////////////////////////////////////////////////
    // 结果判断
    ///////////////////////////////////////////////////////////////////////////////////////

    const getAndCheckTaskResult = (task_id) => {
        // 点击一下刷新按钮
        cy.get('span[aria-label="reload"]').click()
        cy.wait("@getDiagnosisTasks").its("response.statusCode").should("eq", 200)
        cy.wait(100)
        cy.get("td")
            .contains(task_id)
            .parent()
            .parent()
            .then($el => {
                let current_text = $el.text()
                if (current_text.indexOf("暂无可用操作") != -1) {
                    // 诊断运行中，等待十秒后再次检查
                    cy.wait(5000)
                    getAndCheckTaskResult(task_id)
                } else {
                    if (current_text.indexOf("查看诊断结果") != -1) {
                        // 诊断已经正常结束
                        cy.wrap($el).find("td").contains("查看诊断结果").click()
                    } else {
                        // 诊断已经异常结束
                        cy.wrap($el).find("td").contains("查看出错信息").click()
                    }
                    cy.wait("@getTaskDetail").then(interception => {
                        expect(interception).to.have.property('response')
                        expect(interception.response?.body.code, 'code').to.equal(200)
                        expect(interception.response.statusCode).to.equal(200)
                        // 执行回调函数
                        resultCheckCallback && resultCheckCallback(interception.response.body.data)
                    })
                }
            })
    }

    cy.wait('@createDiagnosisTask')
        .then((interception) => {
            expect(interception).to.have.property('response')
            expect(interception.response?.body.code, 'code').to.equal(200)
            expect(interception.response.statusCode).to.equal(200)
            expect(interception.response.body.data).to.have.property("task_id")

            // 得到诊断 ID
            let task_id = interception.response?.body.data.task_id

            // 轮询获取诊断结果
            getAndCheckTaskResult(task_id)
        })
})